package org.upm;

/**
* Hebra que atiende las peticiones realizadas por el SipServlet
* @author Jonathan Gonzalez
* @version 30/10/2008
*/

import java.io.FileReader;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.util.logging.Logger;
import java.util.ArrayList;
import java.util.StringTokenizer;

import au.com.bytecode.opencsv.CSVReader;

public class DroolsThread extends Thread{
	
    //Logger de la clase.
    private static Logger logger =
           Logger.getLogger(DroolsThread.class.getName());
	
	//Datos a devolver al Servlet
	private byte[] data = null;
	
    //Datagram socket de la conexion
    private DatagramSocket dsocket;
    
    //Solicitud recibida del cliente
    private DatagramPacket solicitud;
    
    /**
     * Contructor de la clase 
     * 
     * @param dsocket - socket de la conexión
     * @param solicitud - solicitud recibida del cliente
     * @param ca - Clasificador de Anuncios
     * @param p - Usuarios registrados en el sistema
     * @param anuncios - Anuncios registrados en el sistema.
     */
    public DroolsThread(DatagramSocket dsocket, DatagramPacket solicitud){
    	this.solicitud = solicitud;
    	this.dsocket = dsocket;
    }
    
    /**
     * Ejecucion del cuerpo de la hebra
     */
      @Override
      public void run(){
        	  //Extraemos la solicitud
        	  data = solicitud.getData();
        	  String peticion = new String(data);
        	  StringTokenizer st = new StringTokenizer(peticion,".");
        	  peticion = st.nextToken();
        	  //Extraemos la información del fichero de asterisk
        	  try{
        		String fichero = peticion + "-log-asterisk.csv";
        		System.out.println(fichero);
  		        CSVReader reader = new CSVReader(new FileReader(fichero));;
  		        Poblacion poblacion = new Poblacion();
  	            String[] nextLine;
  	            ArrayList llamadas = new ArrayList();
  	            Usuario llamante = null;
  	            while ((nextLine = reader.readNext()) != null) {
  	                // nextLine[] is an array of values from the line
  	            	llamante = poblacion.dameUsuario((String) nextLine[1]);
  	            	Usuario destinatario = poblacion.dameUsuario((String) nextLine[6]);
  	            	int duracion = Integer.parseInt(nextLine[13]);
  	            	int hora = Integer.parseInt(nextLine[16]);
  	                logger.info( llamante.getNombre() + " llama a " + destinatario.getNombre() + " duración: " + duracion  + " hora de llamada " + hora);
  	                Llamada tmp = new Llamada(hora, llamante, destinatario, duracion);
  	                llamadas.add(tmp);
  	            }
  	            //Establecemos el numero favorito
  	            if(llamante.getNombre().equals("Pedro")){
  	            	Usuario favorito = poblacion.dameUsuario("Manuel");
  	            	llamante.setFavorito(favorito);
  	            }
  	            //Generamos la factura y la enviamos al cliente
  	            GeneradorRecibo gr = new GeneradorRecibo();
  	            Factura factura = gr.generaRecibo("Facturacion.drl", llamante, llamadas);
  	            String datos = factura.getLlamadasMovistar() + "." + factura.getSegundosMovistar() + "." + 
  	                       factura.getLlamadasVodafone() + "." + factura.getSegundosVodafone() + "." +
  	                       factura.getLlamadasOrange() + "." + factura.getSegundosOrange() + "." +
  	                       factura.getLlamadasYoigo() + "." + factura.getSegundosYoigo() + "." +
  	                       factura.getPrecio() + ".";
  	                       
  	          byte[] respuesta = datos.getBytes();
  			  DatagramPacket dp = new DatagramPacket(respuesta, respuesta.length,
  					  solicitud.getAddress(), solicitud.getPort());
  			  dsocket.send(dp); 
  			  
  			  /*
  			   * Servicio Especial de Facturación
  			   */
	          //Objetenemos las tarifas que podemos usar.
              GeneradorTarifas ga = new GeneradorTarifas();
              Object[] tarifas = ga.dameTarifas();
              
              //Creamos el objeto que seleccionará la tarifa
              Tarificador tarificador = new Tarificador();
              Object[] listaLlamadas = llamadas.toArray(); 
              //Establecemos la mejor tarifa para cada una de las llamadas.
              for(int i = 0; i < listaLlamadas.length-1; i ++){
              	Llamada temporal = (Llamada) listaLlamadas[i];
              	tarificador.seleccionaTarifa(temporal, tarifas);
              }     
              //Devolvemos la información al cliente.
              Factura f1 = new Factura();
              llamante.setFactura(f1);
	          Factura facturaEspecial = gr.generaRecibo("FacturacionEspecial.drl", llamante, llamadas);
	          String datos2 = facturaEspecial.getLlamadasMovistar() + "." + facturaEspecial.getSegundosMovistar() + "." + 
                facturaEspecial.getLlamadasVodafone() + "." + facturaEspecial.getSegundosVodafone() + "." +
                facturaEspecial.getLlamadasOrange() + "." + facturaEspecial.getSegundosOrange() + "." +
                facturaEspecial.getLlamadasYoigo() + "." + facturaEspecial.getSegundosYoigo() + "." +
                facturaEspecial.getPrecio() + ".";
                
              byte[] respuesta2 = datos2.getBytes();
	          DatagramPacket dp2 = new DatagramPacket(respuesta2, respuesta2.length,
			         solicitud.getAddress(), solicitud.getPort());
	          dsocket.send(dp2); 
  			}catch(Exception e){
  				System.out.println(e.getMessage());
  			}

     }
}


